package com.kds.smarthome.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

import java.util.concurrent.*;

/**
 * 线程池配置类
 * 定义应用使用的各种线程池
 */
@Configuration
@EnableAsync
public class ThreadPoolConfig {
    
    /**
     * IP地址定位专用线程池
     * 使用有界队列和拒绝策略，避免任务堆积
     */
    @Bean(name = "ipLocationThreadPool")
    public ExecutorService ipLocationThreadPool() {
        return new ThreadPoolExecutor(
            1,                                  // 核心线程数
            5,                                  // 最大线程数
            60L,                                // 空闲线程存活时间
            TimeUnit.SECONDS,                   // 时间单位
            new LinkedBlockingQueue<>(100),     // 有界任务队列
            new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时的拒绝策略：由调用者线程执行
        );
    }
    
    /**
     * 通用异步任务线程池
     */
    @Bean(name = "asyncTaskExecutor")
    public ThreadPoolExecutor asyncTaskExecutor() {
        return new ThreadPoolExecutor(
            5,                                  // 核心线程数
            20,                                 // 最大线程数
            60L,                                // 空闲线程存活时间
            TimeUnit.SECONDS,                   // 时间单位
            new LinkedBlockingQueue<>(500),     // 有界任务队列
            new ThreadFactory() {
                @Override
                public Thread newThread(Runnable r) {
                    Thread thread = new Thread(r);
                    thread.setName("async-task-" + thread.getId());
                    return thread;
                }
            },
            new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时的拒绝策略：由调用者线程执行
        );
    }
} 